Hello World 和 Python 单元测试

您所在的位置:网站首页 window hello在哪里 Hello World 和 Python 单元测试

Hello World 和 Python 单元测试

#Hello World 和 Python 单元测试| 来源: 网络整理| 查看: 265

你好社区。我已经在 IT 领域工作了十年左右,现在我正在涉足该领域的“深层次”。也许我应该使用“更深”,因为深度可能在某种程度上是一个视角问题。我希望你们中的许多人都有一个可以自信地指出并宣称他们是真正的疯子的群体。

我遇到了一份关于使用unittest和pytest测试代码的详尽指南。我将其浓缩为简明的方法。在本文中,我将重点介绍如何使用unittest以及如何理解有时令人困惑的结果。

软件测试有助于识别代码中可能导致错误的错误和不一致。ISTQB将软件测试分为 4 个级别:

单元测试 - 测试特定的代码行

集成测试 - 测试多个单元之间的集成

系统测试 - 测试整个系统

验收测试 - 检查是否符合验收标准

重要的是要注意,仅仅因为测试通过,并不意味着该软件完全没有错误。 (如果真那么容易就好了!)

单元测试验证“单元”的正确行为,该单元可能是类、函数或方法,具体取决于语言。单元测试是一个低级过程,可以在错误传播到软件系统的其他级别之前在本地级别识别错误。单独测试多个单元有几个好处: 它简化了识别和定位集成问题。未来修改产生的错误可以更容易定位(提供良好的测试历史和文档)。重复测试单元输入和输出的关系,在部署之前提供文档(结果)。

单元测试的附加质量:

快速(大多数情况下)

隔离 - 单个单元的测试不依赖于外部进程(如网络资源、文件等)

可重复 - 许多测试可以确认结果的一致性

命名 - 单元测试的名称应明确测试目的

编写单元测试的常见组织策略是安排、行动和断言 (AAA) 模式。

排列 - 设置对象和变量

Act - 调用被测试的单元(函数/类/方法)

断言 - 声明预期结果

拥有像 AAA 这样的统一策略将确保您的测试干净且易于阅读。

Python 中的单元测试 主要使用unittest和pytest执行。

unittest包含在标准 Python 库中,包含:

测试用例 - 测试单个单元

测试套件 - 一起运行的一组测试

test runner - 处理所有测试用例的执行和结果的组件

unittest被编写为unittest.TestCase子类的类的方法,并且可以使用特殊的断言方法。

该指南使用了一个银行账户的示例,该银行账户旨在不允许提款大于当前余额:

import unittest class BankAccount: def __init__(self, id): self.id = id self.balance = 0 def withdraw(self, amount): if self.balance >= amount: self.balance -= amount return True return False def deposit(self, amount): self.balance += amount return True

进入全屏模式 退出全屏模式

通过创建类TestBankOperations(它是unittest.TestCase的子类)在同一个 python 文件中创建一个新的测试用例。

class TestBankOperations(unittest.TestCase): def test_insufficient_deposit(self): # Arrange a = BankAccount(1) a.deposit(100) # Act outcome = a.withdraw(200) # Assert self.assertFalse(outcome)

进入全屏模式 退出全屏模式

请注意 AAA 方法如何用于安排(建立变量)、行动(调用要测试的单元)和断言(验证结果)。还要注意测试方法test_insufficient_deposit如何以test开头。这很重要,因为每个测试方法都必须以test开头。

理想情况下,此测试返回结果false。这是因为我们要求测试存入 100 并尝试提取 200。为了断言结果,该示例使用特殊的断言方法assertFalse()。更简单地说 - 我们期望存入 100 并提取 200将失败。通过使用特殊的断言方法,我们声明如果test_insufficient_deposit失败,测试将通过。

我们通过打开命令行并运行来运行测试

python -m unittest example.py

进入全屏模式 退出全屏模式

(example.py是包含我们正在测试的源代码的文件。)

结果应如下所示:

. ---------------------------------------------------------------------- Ran 1 test in 0.001s OK

进入全屏模式 退出全屏模式

这表明我们的测试通过了,超出余额的提款尝试失败了。

我们可以通过创建另一个尝试向我们的帐户存入负数的单元测试来为此示例生成失败的测试:

def test_negative_deposit(self): # Arrange a = BankAccount(1) # Act outcome = a.deposit(-100) # Assert self.assertFalse(outcome)

进入全屏模式 退出全屏模式

为了从失败的测试中获得更全面的结果,我们在命令行中将-v(详细)添加到unittest。我们运行单元测试,现在将同时运行存款不足测试和负存款测试。

python -m unittest -v example.py

进入全屏模式 退出全屏模式

我们的结果:

test_insufficient_deposit (example.TestBankOperations) ... ok test_negative_deposit (example.TestBankOperations) ... FAIL ====================================================================== FAIL: test_negative_deposit (example.TestBankOperations) ---------------------------------------------------------------------- Traceback (most recent call last): File "example.py", line 35, in test_negative_deposit self.assertFalse(outcome) AssertionError: True is not false ---------------------------------------------------------------------- Ran 2 tests in 0.002s FAILED (failures=1)

进入全屏模式 退出全屏模式

我们在第 35 行看到我们的第二个测试失败。在self.assertFalse(outcome)中,我们断言我们的测试应该返回 false,因为我们不希望我们的程序接受负存款。然而结果是真的(成功),因此我们的测试失败了。

如果拒绝负存款是我们程序的设计要求之一,我们可以使用这些信息来确定我们可能需要修改代码。

unittest根据您的需要有不同的断言方法

assertEqual(x,y)- 测试x==y

assertRaises(exception_type)- 检查是否引发异常

assertIsNone(x)- 测试是否为x is None

assertIn(x,y)- 测试是否为x in y

为了扩展 Python 中单元测试的功能,建议使用pytest库(非原生),它允许使用更少的代码进行更复杂的测试,支持原生unittest套件并提供 800 多个外部插件。

如果您已经做到了这一点,感谢您阅读我的帖子。我希望我能够简明扼要地解释和论证unittest的值,并帮助一些初学者更好地理解有些令人困惑的结果(如assertfalsefailed true is not false)指示。代码示例的功劳归功于 Lorenzo Bonannella 在他的非常详尽的指南中使用unittest和pytest进行测试。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3